<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>TurtleDB: src/ca/uqac/dim/turtledb/HttpCommunicator.java Source File</title>

<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>


</head>
<body>
<div id="top"><!-- do not remove this div! -->


<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  
  
  <td style="padding-left: 0.5em;">
   <div id="projectname">TurtleDB
   
   </div>
   <div id="projectbrief">A mini distributed database system</div>
  </td>
  
  
  
 </tr>
 </tbody>
</table>
</div>

<!-- Generated by Doxygen 1.7.6.1 -->
  <div id="navrow1" class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&#160;Page</span></a></li>
      <li><a href="namespaces.html"><span>Packages</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
    </ul>
  </div>
  <div id="navrow2" class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&#160;List</span></a></li>
    </ul>
  </div>
</div>
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
  initNavTree('_http_communicator_8java.html','');
</script>
<div id="doc-content">
<div class="header">
  <div class="headertitle">
<div class="title">src/ca/uqac/dim/turtledb/HttpCommunicator.java</div>  </div>
</div><!--header-->
<div class="contents">
<a href="_http_communicator_8java.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/*-------------------------------------------------------------------------</span>
<a name="l00002"></a>00002 <span class="comment">    Simple distributed database engine</span>
<a name="l00003"></a>00003 <span class="comment">    Copyright (C) 2012  Sylvain Hallé</span>
<a name="l00004"></a>00004 <span class="comment"></span>
<a name="l00005"></a>00005 <span class="comment">    This program is free software: you can redistribute it and/or modify</span>
<a name="l00006"></a>00006 <span class="comment">    it under the terms of the GNU General Public License as published by</span>
<a name="l00007"></a>00007 <span class="comment">    the Free Software Foundation, either version 3 of the License, or</span>
<a name="l00008"></a>00008 <span class="comment">    (at your option) any later version.</span>
<a name="l00009"></a>00009 <span class="comment"></span>
<a name="l00010"></a>00010 <span class="comment">    This program is distributed in the hope that it will be useful,</span>
<a name="l00011"></a>00011 <span class="comment">    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00012"></a>00012 <span class="comment">    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00013"></a>00013 <span class="comment">    GNU General Public License for more details.</span>
<a name="l00014"></a>00014 <span class="comment"></span>
<a name="l00015"></a>00015 <span class="comment">    You should have received a copy of the GNU General Public License</span>
<a name="l00016"></a>00016 <span class="comment">    along with this program.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span>
<a name="l00017"></a>00017 <span class="comment"> -------------------------------------------------------------------------*/</span>
<a name="l00018"></a>00018 <span class="keyword">package </span>ca.uqac.dim.turtledb;
<a name="l00019"></a>00019 
<a name="l00020"></a>00020 <span class="keyword">import</span> java.io.*;
<a name="l00021"></a>00021 <span class="keyword">import</span> java.net.*;
<a name="l00022"></a>00022 <span class="keyword">import</span> java.util.*;
<a name="l00023"></a>00023 
<a name="l00024"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html">00024</a> <span class="keyword">public</span> <span class="keyword">class </span><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html">HttpCommunicator</a> <span class="keyword">extends</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_communicator.html">Communicator</a>
<a name="l00025"></a>00025 {
<a name="l00026"></a>00026   
<a name="l00027"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a671d62a9000271516d3054ba7d622365">00027</a>   <span class="keyword">protected</span> Map&lt;String,SiteInfo&gt; <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a671d62a9000271516d3054ba7d622365">m_siteInfo</a>;
<a name="l00028"></a>00028   
<a name="l00029"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a424d74bd7e60b0b0ef15e0a36f5fd056">00029</a>   <span class="keyword">protected</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_engine.html">Engine</a> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a424d74bd7e60b0b0ef15e0a36f5fd056">m_engine</a>;
<a name="l00030"></a>00030   
<a name="l00031"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a37c1eec640f68743c32cd5e75f326079">00031</a>   <span class="keyword">public</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a37c1eec640f68743c32cd5e75f326079">HttpCommunicator</a>()
<a name="l00032"></a>00032   {
<a name="l00033"></a>00033     super();
<a name="l00034"></a>00034     <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a671d62a9000271516d3054ba7d622365">m_siteInfo</a> = <span class="keyword">new</span> HashMap&lt;String,SiteInfo&gt;();
<a name="l00035"></a>00035   }
<a name="l00036"></a>00036   
<a name="l00037"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a086f059cad9c9302a2b4ee943f1015af">00037</a>   <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a086f059cad9c9302a2b4ee943f1015af">addSiteInfo</a>(String name, String url)
<a name="l00038"></a>00038   {
<a name="l00039"></a>00039     <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html">SiteInfo</a> si = <span class="keyword">new</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html">SiteInfo</a>(name, url);
<a name="l00040"></a>00040     <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a671d62a9000271516d3054ba7d622365">m_siteInfo</a>.put(name, si);
<a name="l00041"></a>00041   }
<a name="l00042"></a>00042   
<a name="l00043"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a0acb624425c4b36e55464fd63144b5be">00043</a>   <span class="keyword">protected</span> <span class="keywordtype">void</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a0acb624425c4b36e55464fd63144b5be">sendQuery</a>(String site_name, <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_relation.html">Relation</a> r) <span class="keywordflow">throws</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_communicator.html">Communicator</a>.QueryExecutionException
<a name="l00044"></a>00044   {
<a name="l00045"></a>00045     <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html">SiteInfo</a> si = <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a671d62a9000271516d3054ba7d622365">m_siteInfo</a>.get(site_name);
<a name="l00046"></a>00046     <span class="keywordflow">if</span> (si == null)
<a name="l00047"></a>00047     {
<a name="l00048"></a>00048       <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_communicator.html">Communicator</a>.QueryExecutionException(<span class="stringliteral">&quot;Unknown site: &quot;</span> + site_name);
<a name="l00049"></a>00049     }
<a name="l00050"></a>00050     String soap_string = <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_xml_query_formatter.html">XmlQueryFormatter</a>.<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_xml_query_formatter.html#ad5f81fab61516198acd7e3b14d4327a1">toXmlString</a>(r);
<a name="l00051"></a>00051     @SuppressWarnings(<span class="stringliteral">&quot;unused&quot;</span>)
<a name="l00052"></a>00052     String return_value = <span class="stringliteral">&quot;&quot;</span>;
<a name="l00053"></a>00053     <span class="keywordflow">try</span>
<a name="l00054"></a>00054     {
<a name="l00055"></a>00055       return_value = <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#af3129a50f496fffcc20a3dc11ecc0f0b">postData</a>(si.<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a49380b22bdd7775c135dfd9a477abec7">m_siteUrl</a>, soap_string);
<a name="l00056"></a>00056     }
<a name="l00057"></a>00057     <span class="keywordflow">catch</span> (IOException e)
<a name="l00058"></a>00058     {
<a name="l00059"></a>00059       <span class="keywordflow">throw</span> <span class="keyword">new</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_communicator.html">Communicator</a>.QueryExecutionException(<span class="stringliteral">&quot;IOException while sending data to site &quot;</span> + site_name);
<a name="l00060"></a>00060     }
<a name="l00061"></a>00061   }
<a name="l00062"></a>00062   
<a name="l00063"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a627f2704ee53557d829ac325dc2e483b">00063</a>   <span class="keyword">protected</span> <span class="keywordtype">void</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a0acb624425c4b36e55464fd63144b5be">sendQuery</a>(String site_name, Set&lt;Relation&gt; rels) <span class="keywordflow">throws</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_communicator.html">Communicator</a>.QueryExecutionException
<a name="l00064"></a>00064   {
<a name="l00065"></a>00065     <span class="keywordflow">for</span> (<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_relation.html">Relation</a> r : rels)
<a name="l00066"></a>00066       <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a0acb624425c4b36e55464fd63144b5be">sendQuery</a>(site_name, r);
<a name="l00067"></a>00067   }
<a name="l00068"></a>00068   
<a name="l00076"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#ac6303f8c48c9f17219f289e700486314">00076</a>   <span class="keyword">protected</span> String <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#ac6303f8c48c9f17219f289e700486314">sendData</a>(URL url, String data) <span class="keywordflow">throws</span> IOException
<a name="l00077"></a>00077   {
<a name="l00078"></a>00078     URLConnection conn = url.openConnection();
<a name="l00079"></a>00079     conn.setDoOutput(<span class="keyword">true</span>);
<a name="l00080"></a>00080     OutputStreamWriter wr = <span class="keyword">new</span> OutputStreamWriter(conn.getOutputStream());
<a name="l00081"></a>00081     wr.write(data);
<a name="l00082"></a>00082     wr.flush();
<a name="l00083"></a>00083 
<a name="l00084"></a>00084     <span class="comment">// Get the response</span>
<a name="l00085"></a>00085     BufferedReader rd = <span class="keyword">new</span> BufferedReader(<span class="keyword">new</span> InputStreamReader(conn.getInputStream()));
<a name="l00086"></a>00086     String line;
<a name="l00087"></a>00087     StringBuilder out = <span class="keyword">new</span> StringBuilder();
<a name="l00088"></a>00088     <span class="keywordflow">while</span> ((line = rd.readLine()) != null)
<a name="l00089"></a>00089     {
<a name="l00090"></a>00090         out.append(line).append(<span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00091"></a>00091     }
<a name="l00092"></a>00092     wr.close();
<a name="l00093"></a>00093     rd.close();   
<a name="l00094"></a>00094     <span class="keywordflow">return</span> out.toString();
<a name="l00095"></a>00095   }
<a name="l00096"></a>00096   
<a name="l00106"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#af3129a50f496fffcc20a3dc11ecc0f0b">00106</a>   <span class="keyword">protected</span> String <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#af3129a50f496fffcc20a3dc11ecc0f0b">postData</a>(String destination_url, String payload) <span class="keywordflow">throws</span> IOException
<a name="l00107"></a>00107   {
<a name="l00108"></a>00108     URL url = <span class="keyword">new</span> URL(destination_url);
<a name="l00109"></a>00109     StringBuilder out = <span class="keyword">new</span> StringBuilder();
<a name="l00110"></a>00110     out.append(<span class="stringliteral">&quot;POST &quot;</span>).append(url.getFile()).append(<span class="stringliteral">&quot; HTTP/1.1\n&quot;</span>);
<a name="l00111"></a>00111     out.append(<span class="stringliteral">&quot;Host: &quot;</span>).append(url.getHost()).append(<span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00112"></a>00112     out.append(<span class="stringliteral">&quot;User-Agent: TurtleDB\n&quot;</span>);
<a name="l00113"></a>00113     out.append(<span class="stringliteral">&quot;Content-Type: application/xml\n&quot;</span>);
<a name="l00114"></a>00114     out.append(<span class="stringliteral">&quot;Content-Length: &quot;</span>).append(payload.length()).append(<span class="stringliteral">&quot;\n&quot;</span>);
<a name="l00115"></a>00115     out.append(payload);
<a name="l00116"></a>00116     String http_response = <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#ac6303f8c48c9f17219f289e700486314">sendData</a>(url, out.toString());
<a name="l00117"></a>00117     <span class="keywordflow">if</span> (!http_response.startsWith(<span class="stringliteral">&quot;200 OK&quot;</span>))
<a name="l00118"></a>00118       <span class="keywordflow">throw</span> <span class="keyword">new</span> IOException(<span class="stringliteral">&quot;HTTP error code&quot;</span>);
<a name="l00119"></a>00119     <span class="keywordflow">return</span> http_response;
<a name="l00120"></a>00120   }
<a name="l00121"></a>00121   
<a name="l00126"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html">00126</a>   <span class="keyword">protected</span> <span class="keyword">class </span><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html">SiteInfo</a>
<a name="l00127"></a>00127   {
<a name="l00128"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a3742a5dc9a39ffcd5ac899cee90eef73">00128</a>     <span class="keyword">public</span> String <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a3742a5dc9a39ffcd5ac899cee90eef73">m_siteName</a>;
<a name="l00129"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a49380b22bdd7775c135dfd9a477abec7">00129</a>     <span class="keyword">public</span> String <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a49380b22bdd7775c135dfd9a477abec7">m_siteUrl</a>;
<a name="l00130"></a>00130     
<a name="l00131"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a02c72507ec5c4b664330e96e8e44ead8">00131</a>     <span class="keyword">public</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a02c72507ec5c4b664330e96e8e44ead8">SiteInfo</a>(String name, String url)
<a name="l00132"></a>00132     {
<a name="l00133"></a>00133       super();
<a name="l00134"></a>00134       <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a3742a5dc9a39ffcd5ac899cee90eef73">m_siteName</a> = name;
<a name="l00135"></a>00135       <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_site_info.html#a49380b22bdd7775c135dfd9a477abec7">m_siteUrl</a> = url;
<a name="l00136"></a>00136     }
<a name="l00137"></a>00137   }
<a name="l00138"></a>00138 
<a name="l00139"></a>00139   @Override
<a name="l00140"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a38e7c3b1444a33ab46db601f4032eb5c">00140</a>   <span class="keyword">public</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_query_processor.html">QueryProcessor</a> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a38e7c3b1444a33ab46db601f4032eb5c">getQueryProcessor</a>(<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_relation.html">Relation</a> query)
<a name="l00141"></a>00141   {
<a name="l00142"></a>00142     <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_query_plan.html">QueryPlan</a> qp = <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a424d74bd7e60b0b0ef15e0a36f5fd056">m_engine</a>.<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_engine.html#acb1c919eba2627b81af6038737a2e693">getQueryPlan</a>(query);
<a name="l00143"></a>00143     <span class="keywordflow">return</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a38e7c3b1444a33ab46db601f4032eb5c">getQueryProcessor</a>(qp);
<a name="l00144"></a>00144   }
<a name="l00145"></a>00145 
<a name="l00146"></a>00146   @Override
<a name="l00147"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a30e9a95994635de85e8d2b6bf4917c83">00147</a>   <span class="keyword">public</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_query_processor.html">QueryProcessor</a> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a38e7c3b1444a33ab46db601f4032eb5c">getQueryProcessor</a>(<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_query_plan.html">QueryPlan</a> qp)
<a name="l00148"></a>00148   {
<a name="l00149"></a>00149     <span class="keywordflow">return</span> <span class="keyword">new</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html">HttpQueryProcessor</a>(qp);
<a name="l00150"></a>00150   }
<a name="l00151"></a>00151   
<a name="l00152"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html">00152</a>   <span class="keyword">protected</span> <span class="keyword">class </span><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html">HttpQueryProcessor</a> <span class="keyword">extends</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_query_processor.html">QueryProcessor</a>
<a name="l00153"></a>00153   {
<a name="l00154"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a1cda30291a7d67140ef9dd226d576772">00154</a>     <span class="keyword">protected</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_query_plan.html">QueryPlan</a> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a1cda30291a7d67140ef9dd226d576772">m_queryPlan</a>;
<a name="l00155"></a>00155     
<a name="l00156"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a58c61bfa0433d000199410ed579f5c36">00156</a>     <span class="keyword">protected</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_relation.html">Relation</a> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a58c61bfa0433d000199410ed579f5c36">m_result</a>;
<a name="l00157"></a>00157     
<a name="l00158"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a84e5ca96c3a3e9caf1d542a5f9844c8a">00158</a>     <span class="keyword">public</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a84e5ca96c3a3e9caf1d542a5f9844c8a">HttpQueryProcessor</a>(<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_query_plan.html">QueryPlan</a> qp)
<a name="l00159"></a>00159     {
<a name="l00160"></a>00160       <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a1cda30291a7d67140ef9dd226d576772">m_queryPlan</a> = qp;
<a name="l00161"></a>00161     }
<a name="l00162"></a>00162 
<a name="l00163"></a>00163     @Override
<a name="l00164"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a7b06848c826459fcf83f12947954cbe6">00164</a>     <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a7b06848c826459fcf83f12947954cbe6">run</a>()
<a name="l00165"></a>00165     {
<a name="l00166"></a>00166       <span class="comment">// Dispatch query plan pieces to every site</span>
<a name="l00167"></a>00167       <span class="keywordflow">for</span> (String site_name : <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a1cda30291a7d67140ef9dd226d576772">m_queryPlan</a>.keySet())
<a name="l00168"></a>00168       {
<a name="l00169"></a>00169         Set&lt;Relation&gt; rels = <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a1cda30291a7d67140ef9dd226d576772">m_queryPlan</a>.get(site_name);
<a name="l00170"></a>00170         <span class="keywordflow">try</span>
<a name="l00171"></a>00171         {
<a name="l00172"></a>00172           <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#a0acb624425c4b36e55464fd63144b5be">sendQuery</a>(site_name, rels);
<a name="l00173"></a>00173         }
<a name="l00174"></a>00174         <span class="keywordflow">catch</span> (<a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_communicator.html">Communicator</a>.QueryExecutionException e)
<a name="l00175"></a>00175         {
<a name="l00176"></a>00176           e.printStackTrace();
<a name="l00177"></a>00177         }
<a name="l00178"></a>00178       }
<a name="l00179"></a>00179     }
<a name="l00180"></a>00180 
<a name="l00181"></a>00181     @Override
<a name="l00182"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#afd5d848f5b0f0401c50e92c4ca49f830">00182</a>     <span class="keyword">public</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_relation.html">Relation</a> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#afd5d848f5b0f0401c50e92c4ca49f830">getResult</a>()
<a name="l00183"></a>00183     {
<a name="l00184"></a>00184       <span class="keywordflow">return</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator_1_1_http_query_processor.html#a58c61bfa0433d000199410ed579f5c36">m_result</a>;
<a name="l00185"></a>00185     }
<a name="l00186"></a>00186   }
<a name="l00187"></a>00187   
<a name="l00191"></a>00191   @Override
<a name="l00192"></a><a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#abe41c696d53e110e7b1364277183115e">00192</a>   <span class="keyword">public</span> <span class="keywordtype">void</span> <a class="code" href="classca_1_1uqac_1_1dim_1_1turtledb_1_1_http_communicator.html#abe41c696d53e110e7b1364277183115e">run</a>()
<a name="l00193"></a>00193   {
<a name="l00194"></a>00194     <span class="keywordtype">int</span> port = 1234;
<a name="l00195"></a>00195     ServerSocket serversocket = null;
<a name="l00196"></a>00196     <span class="keywordflow">try</span>
<a name="l00197"></a>00197     {
<a name="l00198"></a>00198       serversocket = <span class="keyword">new</span> ServerSocket(port);
<a name="l00199"></a>00199     }
<a name="l00200"></a>00200     <span class="keywordflow">catch</span> (IOException e)
<a name="l00201"></a>00201     {
<a name="l00202"></a>00202       <span class="comment">// Nothing to do if we can&#39;t open a socket</span>
<a name="l00203"></a>00203       <span class="keywordflow">return</span>;
<a name="l00204"></a>00204     }
<a name="l00205"></a>00205     
<a name="l00206"></a>00206     <span class="comment">//go in a infinite loop, wait for connections, process request, send response</span>
<a name="l00207"></a>00207     <span class="keywordflow">while</span> (<span class="keyword">true</span>)
<a name="l00208"></a>00208     {
<a name="l00209"></a>00209       <span class="keywordflow">try</span>
<a name="l00210"></a>00210       {
<a name="l00211"></a>00211         <span class="comment">//this call waits/blocks until someone connects to the port we</span>
<a name="l00212"></a>00212         <span class="comment">//are listening to</span>
<a name="l00213"></a>00213         Socket connectionsocket = serversocket.accept();
<a name="l00214"></a>00214         <span class="comment">//Read the http request from the client from the socket interface</span>
<a name="l00215"></a>00215         <span class="comment">//into a buffer.</span>
<a name="l00216"></a>00216         BufferedReader input =
<a name="l00217"></a>00217             <span class="keyword">new</span> BufferedReader(<span class="keyword">new</span> InputStreamReader(connectionsocket.
<a name="l00218"></a>00218                 getInputStream()));
<a name="l00219"></a>00219         <span class="comment">//Prepare a outputstream from us to the client,</span>
<a name="l00220"></a>00220         <span class="comment">//this will be used sending back our response</span>
<a name="l00221"></a>00221         <span class="comment">//(header + requested file) to the client.</span>
<a name="l00222"></a>00222         DataOutputStream output =
<a name="l00223"></a>00223             <span class="keyword">new</span> DataOutputStream(connectionsocket.getOutputStream());
<a name="l00224"></a>00224         http_handler(input, output);
<a name="l00225"></a>00225       }
<a name="l00226"></a>00226       <span class="keywordflow">catch</span> (Exception e)
<a name="l00227"></a>00227       { 
<a name="l00228"></a>00228         e.printStackTrace();
<a name="l00229"></a>00229       }
<a name="l00230"></a>00230     }
<a name="l00231"></a>00231   }
<a name="l00232"></a>00232   
<a name="l00233"></a>00233   <span class="comment">//this method makes the HTTP header for the response</span>
<a name="l00234"></a>00234   <span class="comment">//the headers job is to tell the browser the result of the request</span>
<a name="l00235"></a>00235   <span class="comment">//among if it was successful or not.</span>
<a name="l00236"></a>00236   <span class="keyword">private</span> String construct_http_header(<span class="keywordtype">int</span> return_code)
<a name="l00237"></a>00237   {
<a name="l00238"></a>00238     String s = <span class="stringliteral">&quot;HTTP/1.1 &quot;</span>;
<a name="l00239"></a>00239     <span class="keywordflow">switch</span> (return_code)
<a name="l00240"></a>00240     {
<a name="l00241"></a>00241       <span class="keywordflow">case</span> 200:
<a name="l00242"></a>00242         s = s + <span class="stringliteral">&quot;200 OK&quot;</span>;
<a name="l00243"></a>00243         <span class="keywordflow">break</span>;
<a name="l00244"></a>00244       <span class="keywordflow">case</span> 400:
<a name="l00245"></a>00245         s = s + <span class="stringliteral">&quot;400 Bad Request&quot;</span>;
<a name="l00246"></a>00246         <span class="keywordflow">break</span>;
<a name="l00247"></a>00247       <span class="keywordflow">case</span> 403:
<a name="l00248"></a>00248         s = s + <span class="stringliteral">&quot;403 Forbidden&quot;</span>;
<a name="l00249"></a>00249         <span class="keywordflow">break</span>;
<a name="l00250"></a>00250       <span class="keywordflow">case</span> 404:
<a name="l00251"></a>00251         s = s + <span class="stringliteral">&quot;404 Not Found&quot;</span>;
<a name="l00252"></a>00252         <span class="keywordflow">break</span>;
<a name="l00253"></a>00253       <span class="keywordflow">case</span> 500:
<a name="l00254"></a>00254         s = s + <span class="stringliteral">&quot;500 Internal Server Error&quot;</span>;
<a name="l00255"></a>00255         <span class="keywordflow">break</span>;
<a name="l00256"></a>00256       <span class="keywordflow">case</span> 501:
<a name="l00257"></a>00257         s = s + <span class="stringliteral">&quot;501 Not Implemented&quot;</span>;
<a name="l00258"></a>00258         <span class="keywordflow">break</span>;
<a name="l00259"></a>00259     }
<a name="l00260"></a>00260     s = s + <span class="stringliteral">&quot;\r\n&quot;</span>;
<a name="l00261"></a>00261     s = s + <span class="stringliteral">&quot;Connection: close\r\n&quot;</span>; <span class="comment">//we can&#39;t handle persistent connections</span>
<a name="l00262"></a>00262     s = s + <span class="stringliteral">&quot;Server: TurtleDB\r\n&quot;</span>; <span class="comment">//server name</span>
<a name="l00263"></a>00263     s = s + <span class="stringliteral">&quot;\r\n&quot;</span>; <span class="comment">//this marks the end of the httpheader</span>
<a name="l00264"></a>00264     <span class="keywordflow">return</span> s;
<a name="l00265"></a>00265   }
<a name="l00266"></a>00266   
<a name="l00267"></a>00267   <span class="keyword">private</span> <span class="keywordtype">void</span> http_handler(BufferedReader input, DataOutputStream output)
<a name="l00268"></a>00268   {
<a name="l00269"></a>00269     <span class="keywordtype">int</span> method = 0; <span class="comment">//1 post, 0 not supported</span>
<a name="l00270"></a>00270     <span class="keywordflow">try</span>
<a name="l00271"></a>00271     {
<a name="l00272"></a>00272       String tmp = input.readLine(); <span class="comment">//read from the stream</span>
<a name="l00273"></a>00273       <span class="keywordflow">if</span> (tmp.startsWith(<span class="stringliteral">&quot;POST&quot;</span>))
<a name="l00274"></a>00274       { <span class="comment">//compare it is it GET</span>
<a name="l00275"></a>00275         method = 1;
<a name="l00276"></a>00276       } <span class="comment">//if we set it to method 1</span>
<a name="l00277"></a>00277       <span class="keywordflow">if</span> (method == 0)
<a name="l00278"></a>00278       { <span class="comment">// not supported</span>
<a name="l00279"></a>00279         output.writeBytes(construct_http_header(501));
<a name="l00280"></a>00280         output.close();
<a name="l00281"></a>00281         <span class="keywordflow">return</span>;
<a name="l00282"></a>00282       }
<a name="l00283"></a>00283       String line = input.readLine();
<a name="l00284"></a>00284       <span class="keywordflow">while</span> (line != null)
<a name="l00285"></a>00285       {
<a name="l00286"></a>00286         
<a name="l00287"></a>00287         line = input.readLine();
<a name="l00288"></a>00288       }
<a name="l00289"></a>00289     }
<a name="l00290"></a>00290     <span class="keywordflow">catch</span> (IOException e)
<a name="l00291"></a>00291     {
<a name="l00292"></a>00292       e.printStackTrace();
<a name="l00293"></a>00293     }
<a name="l00294"></a>00294   }
<a name="l00295"></a>00295 
<a name="l00296"></a>00296 }
</pre></div></div><!-- contents -->
</div>
  <div id="nav-path" class="navpath">
    <ul>
      <li class="navelem"><a class="el" href="_http_communicator_8java.html">HttpCommunicator.java</a>      </li>

    <li class="footer">Generated on Tue Nov 20 2012 13:26:47 for TurtleDB by
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.6.1 </li>
   </ul>
 </div>


</body>
</html>
